// package main

// import (
// 	"encoding/json"
// 	"fmt"
// 	"io"
// 	"net/http"
// 	"os"
// 	"path/filepath"
// )

// // VideoResponse 定义从 API 返回的数据结构
// type VideoResponse struct {
// 	Code int    `json:"code"`
// 	Msg  string `json:"msg"`
// 	Data struct {
// 		Video string `json:"video"`
// 	} `json:"data"`
// }

// func main() {
// 	// 定义 API 列表
// 	apiURLs := []string{
// 		"https://api.52vmy.cn/api/video/tianmei",
// 		"https://api.52vmy.cn/api/video/girl",
// 		// 可以继续添加更多 API
// 	}

// 	// 保存链接的文件夹
// 	linkFolder := "video_links"
// 	err := os.MkdirAll(linkFolder, os.ModePerm)
// 	if err != nil {
// 		fmt.Println("Error creating link folder:", err)
// 		return
// 	}

// 	// 下载目录
// 	downloadFolder := "downloaded_videos"
// 	err = os.MkdirAll(downloadFolder, os.ModePerm)
// 	if err != nil {
// 		fmt.Println("Error creating download folder:", err)
// 		return
// 	}

// 	// 第一步：获取所有视频链接并保存到文件夹中
// 	for i, apiURL := range apiURLs {
// 		linkFilePath := filepath.Join(linkFolder, fmt.Sprintf("link_%d.txt", i+1))
// 		videoURL, err := getVideoURL(apiURL)
// 		if err != nil {
// 			fmt.Println("Error fetching video URL from", apiURL, ":", err)
// 			continue
// 		}
// 		err = os.WriteFile(linkFilePath, []byte(videoURL), 0644)
// 		if err != nil {
// 			fmt.Println("Error saving link to file:", err)
// 			continue
// 		}
// 		fmt.Println("Link saved to", linkFilePath)
// 	}

// 	// 第二步：逐个读取链接并下载视频
// 	files, err := os.ReadDir(linkFolder)
// 	if err != nil {
// 		fmt.Println("Error reading link folder:", err)
// 		return
// 	}

// 	for _, file := range files {
// 		linkFilePath := filepath.Join(linkFolder, file.Name())
// 		linkData, err := os.ReadFile(linkFilePath)
// 		if err != nil {
// 			fmt.Println("Error reading link file:", err)
// 			continue
// 		}
// 		videoURL := string(linkData)
// 		if videoURL == "" {
// 			fmt.Println("Empty link in file:", linkFilePath)
// 			continue
// 		}

// 		// 创建单独的视频目录
// 		videoFolder := filepath.Join(downloadFolder, file.Name())
// 		err = os.MkdirAll(videoFolder, os.ModePerm)
// 		if err != nil {
// 			fmt.Println("Error creating video folder:", err)
// 			continue
// 		}

// 		// 下载视频
// 		videoFilePath := filepath.Join(videoFolder, "video.mp4")
// 		err = downloadVideo(videoURL, videoFilePath)
// 		if err != nil {
// 			fmt.Println("Error downloading video from", videoURL, ":", err)
// 		} else {
// 			fmt.Println("Video downloaded successfully:", videoFilePath)
// 		}
// 	}
// }

// // 获取视频链接
// func getVideoURL(apiURL string) (string, error) {
// 	resp, err := http.Get(apiURL)
// 	if err != nil {
// 		return "", err
// 	}
// 	defer resp.Body.Close()

// 	body, err := io.ReadAll(resp.Body)
// 	if err != nil {
// 		return "", err
// 	}

// 	var videoResponse VideoResponse
// 	err = json.Unmarshal(body, &videoResponse)
// 	if err != nil {
// 		return "", err
// 	}

// 	if videoResponse.Code != 200 {
// 		return "", fmt.Errorf("API error: %s", videoResponse.Msg)
// 	}

// 	return videoResponse.Data.Video, nil
// }

// // 下载视频
// func downloadVideo(videoURL, filePath string) error {
// 	resp, err := http.Get(videoURL)
// 	if err != nil {
// 		return err
// 	}
// 	defer resp.Body.Close()

// 	file, err := os.Create(filePath)
// 	if err != nil {
// 		return err
// 	}
// 	defer file.Close()

//		_, err = io.Copy(file, resp.Body)
//		return err
//	}
package main

import (
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"os"
	"path/filepath"
)

// VideoResponse 定义从 API 返回的数据结构
type VideoResponse struct {
	Code int    `json:"code"`
	Msg  string `json:"msg"`
	Data struct {
		Video string `json:"video"`
	} `json:"data"`
}

func main() {
	// 定义 API 列表
	apiURLs := []string{
		"https://api.52vmy.cn/api/video/tianmei",
		"https://api.52vmy.cn/api/video/girl",
		// 可以继续添加更多 API
	}

	// 保存链接的文件夹
	linkFolder := "video_links"
	err := os.MkdirAll(linkFolder, os.ModePerm)
	if err != nil {
		fmt.Println("Error creating link folder:", err)
		return
	}

	// 下载目录
	downloadFolder := "downloaded_videos"
	err = os.MkdirAll(downloadFolder, os.ModePerm)
	if err != nil {
		fmt.Println("Error creating download folder:", err)
		return
	}

	// 第一步：获取所有视频链接并保存到文件夹中
	for i, apiURL := range apiURLs {
		linkFilePath := filepath.Join(linkFolder, fmt.Sprintf("link_%d.txt", i+1))
		videoURL, err := getVideoURL(apiURL)
		if err != nil {
			fmt.Println("Error fetching video URL from", apiURL, ":", err)
			continue
		}
		err = os.WriteFile(linkFilePath, []byte(videoURL), 0644)
		if err != nil {
			fmt.Println("Error saving link to file:", err)
			continue
		}
		fmt.Println("Link saved to", linkFilePath)
	}

	// 第二步：逐个读取链接并下载视频
	files, err := os.ReadDir(linkFolder)
	if err != nil {
		fmt.Println("Error reading link folder:", err)
		return
	}

	for _, file := range files {
		linkFilePath := filepath.Join(linkFolder, file.Name())
		linkData, err := os.ReadFile(linkFilePath)
		if err != nil {
			fmt.Println("Error reading link file:", err)
			continue
		}
		videoURL := string(linkData)
		if videoURL == "" {
			fmt.Println("Empty link in file:", linkFilePath)
			continue
		}

		// 创建单独的视频目录
		videoFolder := filepath.Join(downloadFolder, file.Name())
		err = os.MkdirAll(videoFolder, os.ModePerm)
		if err != nil {
			fmt.Println("Error creating video folder:", err)
			continue
		}

		// 下载视频
		videoFilePath := filepath.Join(videoFolder, "video.mp4")
		err = downloadVideo(videoURL, videoFilePath)
		if err != nil {
			fmt.Println("Error downloading video from", videoURL, ":", err)
		} else {
			fmt.Println("Video downloaded successfully:", videoFilePath)
		}
	}
}

// 获取视频链接
func getVideoURL(apiURL string) (string, error) {
	resp, err := http.Get(apiURL)
	if err != nil {
		return "", err
	}
	defer resp.Body.Close()

	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return "", err
	}

	var videoResponse VideoResponse
	err = json.Unmarshal(body, &videoResponse)
	if err != nil {
		return "", err
	}

	if videoResponse.Code != 200 {
		return "", fmt.Errorf("API error: %s", videoResponse.Msg)
	}

	return videoResponse.Data.Video, nil
}

// 下载视频
func downloadVideo(videoURL, filePath string) error {
	resp, err := http.Get(videoURL)
	if err != nil {
		return err
	}
	defer resp.Body.Close()

	file, err := os.Create(filePath)
	if err != nil {
		return err
	}
	defer file.Close()

	_, err = io.Copy(file, resp.Body)
	return err
}
